package com.unitd.scheduler.registry.impl;

import com.unitd.scheduler.model.JobConfig;
import com.unitd.scheduler.registry.IJobRegistry;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @desc 单机部署服务,处理定时任务执行控制的接口实现类
 * 此类中,主要用于控制定时服务的注册、销毁、服务的初始化、调用、销毁等处理
 * @filename ZkJobRegistry.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2016/10/10
 */
public class NullJobRegistry implements IJobRegistry {

	private Map<String, JobConfig> schedulerConfgs = new ConcurrentHashMap<>();

	/**
	 * @param conf 定时任务配置信息
	 * @desc 向一致性服务端(zookeeper/redis)注册定时服务
	 */
	@Override
	public void register(JobConfig conf) {
		schedulerConfgs.put(conf.getJobName(), conf);
	}

	/**
	 * @return 定时任务配置信息列表
	 * @desc 获取所有的定时任务配置信息
	 */
	@Override
	public List<JobConfig> getAllJobs() {
		return new ArrayList<>(schedulerConfgs.values());
	}

	/**
	 * @param jobName     定时任务名称
	 * @param forceRemote 是否强制从远程的一致性服务端(zookeeper/redis)获取和同步
	 * @return JobConfig
	 * @desc 根据指定的定时任务名称获取该定时任务的配置信息
	 * 如果时强制从远程一致性服务端(zookeeper/redis)获取,则需要重新同步远程与本地服务的定时任务配置信息之后再返回
	 */
	@Override
	public JobConfig getConf(String jobName, boolean forceRemote) {
		return schedulerConfgs.get(jobName);
	}

	/**
	 * @param conf 定时任务配置信息
	 * @desc 更新定时任务的配置信息
	 */
	@Override
	public void updateJobConfig(JobConfig conf) {
		schedulerConfgs.put(conf.getJobName(), conf);
	}

	/**
	 * @param jobName  定时任务名称
	 * @param fireTime 首次启动时间
	 * @desc 设置需要运行的定时任务
	 */
	@Override
	public void setRuning(String jobName, Date fireTime) {
		JobConfig config = schedulerConfgs.get(jobName);
		config.setRunning(true);
		config.setLastFireTime(fireTime);
	}

	/**
	 * @param jobName      定时任务名称
	 * @param nextFireTime 下次启动时间
	 * @param errorMsg     异常消息
	 * @desc 停止定时任务
	 */
	@Override
	public void setStoping(String jobName, Date nextFireTime, String errorMsg) {
		JobConfig config = schedulerConfgs.get(jobName);
		config.setRunning(false);
		config.setNextFireTime(nextFireTime);
	}

	/**
	 * @param jobName 定时任务名称
	 * @desc 从一致性服务端(zookeeper/redis)中将注册定时服务删除
	 */
	@Override
	public void unregister(String jobName) {
		schedulerConfgs.clear();
		schedulerConfgs = null;
	}

	/**
	 * @desc 从一致性服务端(zookeeper/redis)中将指定路径下的已注册的定时任务删除
	 */
	@Override
	public void onRegistered() {

	}
}